<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="TPkAC" id="TPkAC"><span data-lake-id="u103fcb06" id="u103fcb06">典型回答</span></h1>
  <p data-lake-id="uecb8dfad" id="uecb8dfad"><br></p>
  <p data-lake-id="ua7ae5069" id="ua7ae5069"><span data-lake-id="u7804c99e" id="u7804c99e">热点数据更新是指频繁更新某个或某些特定行的数据，比如大促期间，有一个大商家，如小米旗舰店、Apple旗舰店等他们的某个商品，会因为有很多人要买，所以他就是热点商品，而大家在短时间内同时买这个商品的时候，就会热点更新这个商品的库存，这就是所谓的热点数据更新，或者叫做热点行更新，如：</span></p>
  <p data-lake-id="udcccd65d" id="udcccd65d"><span data-lake-id="ua916f787" id="ua916f787">​</span><br></p>
  <pre lang="java"><code>
UPDATE products
SET stock_quantity = stock_quantity - 10
WHERE product_id = 10086;
</code></pre>
  <p data-lake-id="uea5bd65f" id="uea5bd65f"><span data-lake-id="uc23abd16" id="uc23abd16">​</span><br></p>
  <p data-lake-id="u2a5213ec" id="u2a5213ec"><span data-lake-id="ud1074f18" id="ud1074f18">热点数据的更新是我们需要避免的，因为他存在以下问题：</span></p>
  <p data-lake-id="u6d7e8d28" id="u6d7e8d28"><span data-lake-id="u46ebd5c6" id="u46ebd5c6">​</span><br></p>
  <p data-lake-id="u87432074" id="u87432074"><span data-lake-id="u08d37d9c" id="u08d37d9c">1、锁竞争，热点数据的更新是通过update语句进行的，而update是需要给记录增加排他锁的，这就会导致大量的请求被阻塞。降低整个系统的吞吐量。</span></p>
  <p data-lake-id="ua2b82b78" id="ua2b82b78"><span data-lake-id="uc5a679a9" id="uc5a679a9">​</span><br></p>
  <p data-lake-id="uc74b5efa" id="uc74b5efa"><span data-lake-id="u2e09e863" id="u2e09e863">2、占用数据库连接，当有大量的update语句，因为要修改同一条记录而被阻塞的时候，他们持有的数据库连接是不会释放的，而数据库连接又是有限的，所以会导致连接数不够，进而影响整个系统的吞吐量及可用性。</span></p>
  <p data-lake-id="ueb970014" id="ueb970014"><span data-lake-id="u0521b850" id="u0521b850">​</span><br></p>
  <p data-lake-id="u3e11e55e" id="u3e11e55e"><span data-lake-id="u68a2398d" id="u68a2398d">3、耗尽数据库CPU，大量锁等待，就会导致大量的自旋，多个线程就会不断的尝试获取锁，CPU就需要不断的执行自旋操作，消耗大量CPU时间。并且在这个过程中，操作系统也需要频繁的进行线程上下文的切换，这个过程会导致CPU时间片的浪费。</span></p>
  <p data-lake-id="u657a217f" id="u657a217f"><span data-lake-id="u0c7c7684" id="u0c7c7684">​</span><br></p>
  <p data-lake-id="u70970dee" id="u70970dee"><span data-lake-id="u9d68b98f" id="u9d68b98f">​</span><br></p>
  <p data-lake-id="u76ac8f12" id="u76ac8f12"><span data-lake-id="ucd59a0fb" id="ucd59a0fb">4、死锁风险，在高并发的情况下。由于数据库需要频繁定位和更新这些特定行，可能会增加锁竞争和死锁的风险，影响并发性能。</span></p>
  <p data-lake-id="u645db398" id="u645db398"><span data-lake-id="ud875ccc9" id="ud875ccc9">​</span><br></p>
  <p data-lake-id="u027412d0" id="u027412d0"><span data-lake-id="u11e96c37" id="u11e96c37">5、索引维护开销大，频繁的更新热点数据，不仅会导致数据的变化，还可能导致相关索引的频繁维护，这可能会增加数据库的开销，导致性能下降。</span></p>
  <p data-lake-id="u5c62ddec" id="u5c62ddec"><span data-lake-id="u3d73eca3" id="u3d73eca3">​</span><br></p>
  <p data-lake-id="u5a985aa7" id="u5a985aa7"><span data-lake-id="u8b3b8cc3" id="u8b3b8cc3">6、主从不一致，热点数据的频繁更新，如果在主从复制出现延迟的情况下，就会放大数据不一致的概率。</span></p>
  <p data-lake-id="u7a88bc81" id="u7a88bc81"><span data-lake-id="ubb5073b7" id="ubb5073b7">​</span><br></p>
  <h1 data-lake-id="AjpTt" id="AjpTt"><span data-lake-id="ue5454fd3" id="ue5454fd3">扩展知识</span></h1>
  <p data-lake-id="uc57bac73" id="uc57bac73"><br></p>
  <h2 data-lake-id="l6UgO" id="l6UgO"><span data-lake-id="u2cc9df70" id="u2cc9df70">如何解决和避免</span></h2>
  <p data-lake-id="ub2663807" id="ub2663807"><br></p>
  <p data-lake-id="ue91d0ca4" id="ue91d0ca4"><br></p>
 </body>
</html>